if _G.RequireLuas ~= nil then           --导入本脚本所需的所有外部脚本
	for _,v in ipairs(_G.RequireLuas) do
		require(v);
	end
end
require("Util");
if _G.ScaleTime ~= nil then
	scaleTime = _G.ScaleTime;			--脚本相邻两次被调用的时间间隔
end
local PathOpCode = {Enter = 1, Exit = 2, Path = 3}				--操作码
local operaThreadArray = {};									--需要进行操作的对象
local targetArray = {};					--角色当前目标点
local pathResult = {};                  --寻路结果将存储在该表中

function  Start()
	-- body
end

function  Update()
	while true do
		pathResult = {};                         --对寻路结果进行重置
		if _G.action ~= nil then                 --_G.action[1]为操作码，1玩家进入，2玩家离开，3玩家移动
			local action = _G.action;             --取出外部传入的参数，并删除源数据
			_G.action = nil;
			coroutine.yield("opera"..action[1]);
			if action[1] == PathOpCode.Enter then                                           		--进入操作：操作码、ID、初始X、初始Y
				local operaThread = coroutine.create(function()             --每一个寻路对象都是一个线程
					local id = action[2];
					local pathLine = nil;          --移动到目的地所需要走过的点集合
					local pathIndex = 1;           --点集合的索引下标，线程根据索引下标标识当前的移动目标
					local timer = 0;               --时间计数器，用于进行时间的掐算
					local timeLength = 0;          --时间步长，当时间计数器到达该步长时，则对象已到达当前目标点
					local target = nil;            --最终目标点
					local isPath = 0;              --是否进行寻路操作，0为不寻路，1为进行寻路
					local beginPos = {x = action[3], y = action[4]};       --记录每次移动时起始点
					coroutine.yield("beginX"..beginPos.x);
					local speed = 5;             --移动速度
					local currentTarget = nil;     --当前阶段的移动目标点
					while true do
						if targetArray["Role"..id] ~= nil then               --检测到有新的移动目标
							if isPath == 1 and currentTarget ~= nil then           --对象正在进行前一个阶段寻路操作，则计算出当前对象的位置，并将该位置设为本次寻路的起始点
								local timePro = timer / timeLength;
								currentTarget = {x = (currentTarget.x-beginPos.x)*timePro+beginPos.x, y = (currentTarget.y-beginPos.y)*timePro+beginPos.y}; 
								beginPos = {x = currentTarget.x, y = currentTarget.y};
							end
							local s = search(beginPos);				--离起始点最近的标识点
							target = targetArray["Role"..id];
							local t = search(target);				--离目标点最近的标识点
							pathLine = line["L"..s.."_"..t];		--得到起始点到目标点的路径集合，该集合存储了标识点的索引下标
							targetArray["Role"..id] = nil;
							timer = 0;
							timeLength = 0;
							isPath = 1;
							coroutine.yield("isCross"..target.isCross);
							if target.isCross == 0 then
								pathIndex = table.getn(pathLine);
							else
								pathIndex = 0;
							end
						end
						if isPath == 1 then
							if timer > timeLength or timer == timeLength then   --时间计数器触发事件
								if currentTarget ~= nil then
									beginPos = {x = currentTarget.x, y = currentTarget.y};
								end
								if pathIndex == -1 then                     	--到达最终目标点，结束本阶段的寻路
									isPath = 0;
									-- timeLength = 0;
								elseif pathLine[pathIndex + 1] == nil then		--到达路径集合最后一个点，返回最终目标点
									pathIndex = -1;
									currentTarget = target;
									timeLength = getlen(beginPos, currentTarget) / speed
									table.insert(pathResult, {id, currentTarget.x, currentTarget.y});
								else                                			--到达任意标识点，返回下一个标识点
									pathIndex = pathIndex + 1;
									currentTarget = point[pathLine[pathIndex]];
									timeLength = getlen(beginPos, currentTarget) / speed;
									table.insert(pathResult, {id, currentTarget.x, currentTarget.y});
								end
								timer = 0;
							end
							timer = timer + scaleTime;
						end
						coroutine.yield();
					end
				end);
				if operaThread ~= nil then
					table.insert(operaThreadArray, operaThread);		--将新加入的对象线程添加到线程集
				end
			elseif action[1] == PathOpCode.Exit then                    --进行退出操作，将指定线程从线程集中删除
				operaThreadArray["Role"..action[2]] = nil;
			elseif action[1] == PathOpCode.Path then                    --进行寻路操作，将寻路目标点添加到目标集
				roleId = action[2];
				targetArray["Role"..roleId] = {x = action[3], y = action[4], isCross = action[5]};
			end
		end

		for i,v in ipairs(operaThreadArray) do                      --依次启动所有线程
			coroutine.resume(v);
		end
		coroutine.yield(pathResult);                                --返回最终结果
	end
end

function Destory()
	-- body
end